extends CardState

const MOUSE_Y_SNAPBACK_THRESHOLD := 138

#瞄准状态要做两件事
#1.将卡牌居中
#2.像Events发出信号，代表瞄准开始，触发目录结构上很远的指示器控件代码
func  enter() -> void:
	#思考:这里为什么要清空目标？
	#答:因为使得卡片居中的这个操作不会触发退出界面上方碰撞区域的回调函数，故不会擦除targets,所以需要这里手动删除，否则会影响到拖动状态的判断
	card_ui.targets.clear()
	#思考:下面三行代码什么意思？
	#答:offset是卡片的偏移量，？，？
	var offset := Vector2(card_ui.parent.size.x / 2, -card_ui.size.y / 2)
	offset.x -= card_ui.size.x / 2
	card_ui.animate_to_position(card_ui.parent.global_position + offset, 0.2)
	#思考:为什么要禁用检测到别的物体进入该碰撞区域
	card_ui.drop_point_detector.monitoring = false
	#思考:为什么在这里发射总线的信号？
	#猜测:把开始瞄准的信号发给CardTargetSelector，以便在目录结构上相距很远的两个组件相互通信调用
	#为了远程通信，因此我们可以判断，connet函数会写在card_target_selector.gd文件中
	Events.card_aim_started.emit(card_ui)

#瞄准结束时把信号传递给CardTargetSelector，以便CardTargetSelector做相应处理
func exit() -> void:
	Events.card_aim_ended.emit(card_ui)
	
func on_input(event: InputEvent) -> void:
	#mouse_motion:鼠标是否移动布尔量，mouse_at_bottom鼠标是否在底部布尔量
	var mouse_motion := event is InputEventMouseMotion
	var mouse_at_bottom := card_ui.get_global_mouse_position().y > MOUSE_Y_SNAPBACK_THRESHOLD
	#如果鼠标在界面下方或者鼠标右击，则切换状态为BASE
	#思考:on_input()触发时机是什么？如果频率很快的话，那么就会发生还没有来得及把鼠标拖动到界面上方就会切换回BASE状态
	#答:这里确实会触发很快，但是需要注意的是，在进入瞄准状态时，鼠标已经拖到了界面上方
	if (mouse_motion and mouse_at_bottom) or event.is_action_pressed("right_mouse"):
		transition_requested.emit(self, CardState.State.BASE)
	#若鼠标在界面上方且没有按下鼠标右键，而是按下/松开鼠标左键，就会将状态切换为RELEASED
	#思考:get_viewport().set_input_as_handled()是为了防止别的回调函数捕获，请问这里为什么要加这行代码？不加会怎么样
	#感觉这里切换回BASE会更好
	elif event.is_action_released("left_mouse") or event.is_action_pressed("left_mouse"):
			get_viewport().set_input_as_handled()
			transition_requested.emit(self, CardState.State.RELEASED)
	
	
	
	
	
	
	
	
	
	
	
	
	
